#pragma once
#include<iostream>
#include<stdarg.h>
#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4
std::string leveltostring(int level)
{
    switch(level)
    {
        case Info: return "Info";
        case Debug: return "Debug";
        case Warning: return "Warning";
        case Error: return "Error";
        case Fatal: return "Fatal";
        default: return "None";
    }
}
void logmessage(int level, const char* format, ...)
{
    time_t t = time(nullptr);
    struct tm * ctime = localtime(&t);
    char initbuffer[1024];
    snprintf(initbuffer, sizeof(initbuffer), "[%s][%d-%d-%d %d:%d:%d]", leveltostring(level).c_str(),
            ctime->tm_year+1900, ctime->tm_mon+1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);
    va_list s;
    va_start(s,format);    
    char logbuffer[1024];
    vsnprintf(logbuffer, sizeof(logbuffer), format, s);
    va_end(s);
    char logtxt[2048];
    snprintf(logtxt, sizeof(logtxt), "%s %s\n", initbuffer, logbuffer);
    printf("%s", logtxt);
}